{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 心脏病结果分类（SVM）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "diseaseResults = np.loadtxt('data/heart.csv', delimiter=',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "diseasex = diseaseResults[:, 0:-1]\n",
    "diseasey = diseaseResults[:, -1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((212, 13), (212,), (91, 13), (91,))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 数据集分割\n",
    "from sklearn.model_selection import train_test_split\n",
    "trainX, testX, trainY, testY = train_test_split(diseasex, diseasey, test_size = 0.3, random_state = 32)\n",
    "trainX.shape, trainY.shape, testX.shape, testY.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 引入模型\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import precision_score\n",
    "from sklearn.metrics import recall_score\n",
    "from sklearn.metrics import f1_score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.核函数选基于半径的核函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rbf：C=0.1\n",
      "精度： 0.52 查准率： 0.52 查全率： 1.0 f1： 0.68\n"
     ]
    }
   ],
   "source": [
    "clf_r0=SVC(kernel='rbf',C=0.1)\n",
    "clf_r0.fit(trainX,trainY)\n",
    "prediction=clf_r0.predict(testX)\n",
    "as_disease_r=round(accuracy_score(testY,prediction),2)\n",
    "ps_disease_r=round(precision_score(testY,prediction),2)\n",
    "rs_disease_r=round(recall_score(testY,prediction),2)\n",
    "f1_disease_r=round(f1_score(testY,prediction),2)\n",
    "print('rbf：C=0.1')\n",
    "print('精度：',as_disease_r,'查准率：',ps_disease_r,'查全率：',rs_disease_r,'f1：',f1_disease_r)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "rbf：C=1\n",
      "精度： 0.68 查准率： 0.63 查全率： 0.91 f1： 0.75\n"
     ]
    }
   ],
   "source": [
    "clf_r0=SVC(kernel='rbf',C=1)\n",
    "clf_r0.fit(trainX,trainY)\n",
    "prediction=clf_r0.predict(testX)\n",
    "as_disease_r=round(accuracy_score(testY,prediction),2)\n",
    "ps_disease_r=round(precision_score(testY,prediction),2)\n",
    "rs_disease_r=round(recall_score(testY,prediction),2)\n",
    "f1_disease_r=round(f1_score(testY,prediction),2)\n",
    "print('rbf：C=1')\n",
    "print('精度：',as_disease_r,'查准率：',ps_disease_r,'查全率：',rs_disease_r,'f1：',f1_disease_r)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.核函数选linear"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear：C=0.1\n",
      "精度： 0.71 查准率： 0.64 查全率： 1.0 f1： 0.78\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n"
     ]
    }
   ],
   "source": [
    "clf=LinearSVC(C=0.1)\n",
    "clf.fit(trainX,trainY)\n",
    "prediction=clf.predict(testX)\n",
    "as_disease_l=round(accuracy_score(testY,prediction),2)\n",
    "ps_disease_l=round(precision_score(testY,prediction),2)\n",
    "rs_disease_l=round(recall_score(testY,prediction),2)\n",
    "f1_disease_l=round(f1_score(testY,prediction),2)\n",
    "print('linear：C=0.1')\n",
    "print('精度：',as_disease_l,'查准率：',ps_disease_l,'查全率：',rs_disease_l,'f1：',f1_disease_l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear：C=0.7\n",
      "精度： 0.81 查准率： 0.74 查全率： 0.98 f1： 0.84\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n"
     ]
    }
   ],
   "source": [
    "clf=LinearSVC(C=0.8)\n",
    "clf.fit(trainX,trainY)\n",
    "prediction=clf.predict(testX)\n",
    "as_disease_l=round(accuracy_score(testY,prediction),2)\n",
    "ps_disease_l=round(precision_score(testY,prediction),2)\n",
    "rs_disease_l=round(recall_score(testY,prediction),2)\n",
    "f1_disease_l=round(f1_score(testY,prediction),2)\n",
    "print('linear：C=0.7')\n",
    "print('精度：',as_disease_l,'查准率：',ps_disease_l,'查全率：',rs_disease_l,'f1：',f1_disease_l)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear：C=1\n",
      "精度： 0.85 查准率： 0.87 查全率： 0.83 f1： 0.85\n"
     ]
    }
   ],
   "source": [
    "clf=LinearSVC(C=1)\n",
    "clf.fit(trainX,trainY)\n",
    "prediction=clf.predict(testX)\n",
    "as_spam_l=round(accuracy_score(testY,prediction),2)\n",
    "ps_spam_l=round(precision_score(testY,prediction),2)\n",
    "rs_spam_l=round(recall_score(testY,prediction),2)\n",
    "f1_spam_l=round(f1_score(testY,prediction),2)\n",
    "print('linear：C=1')\n",
    "print('精度：',as_spam_l,'查准率：',ps_spam_l,'查全率：',rs_spam_l,'f1：',f1_spam_l)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.核函数选sigmoid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sigmoid：C=0.1\n",
      "精度： 0.52 查准率： 0.52 查全率： 1.0 f1： 0.68\n",
      "sigmoid：C=1\n",
      "精度： 0.52 查准率： 0.52 查全率： 1.0 f1： 0.68\n"
     ]
    }
   ],
   "source": [
    "clf_s0=SVC(kernel='sigmoid',C=0.1)\n",
    "clf_s0.fit(trainX,trainY)\n",
    "prediction=clf_s0.predict(testX)\n",
    "as_spam_s=round(accuracy_score(testY,prediction),2)\n",
    "ps_spam_s=round(precision_score(testY,prediction),2)\n",
    "rs_spam_s=round(recall_score(testY,prediction),2)\n",
    "f1_spam_s=round(f1_score(testY,prediction),2)\n",
    "print('sigmoid：C=0.1')\n",
    "print('精度：',as_spam_s,'查准率：',ps_spam_s,'查全率：',rs_spam_s,'f1：',f1_spam_s)\n",
    "\n",
    "clf_s1=SVC(kernel='sigmoid',C=1)\n",
    "clf_s1.fit(trainX,trainY)\n",
    "prediction=clf_s1.predict(testX)\n",
    "as_spam_s=round(accuracy_score(testY,prediction),2)\n",
    "ps_spam_s=round(precision_score(testY,prediction),2)\n",
    "rs_spam_s=round(recall_score(testY,prediction),2)\n",
    "f1_spam_s=round(f1_score(testY,prediction),2)\n",
    "print('sigmoid：C=1')\n",
    "print('精度：',as_spam_s,'查准率：',ps_spam_s,'查全率：',rs_spam_s,'f1：',f1_spam_s)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## heart disease分类任务\n",
    "\n",
    "\n",
    "核函数 | C | 精度 | 查准率 | 查全率 | F1\n",
    "- | - | - | - | - | -\n",
    "rbf | 0.1 | 0.52 | 0.52 | 0.1 | 0.68\n",
    "rbf | 1 | 0.68 | 0.63 | 0.91 | 0.75\n",
    "linear | 0.1 | 0.67 | 0.61 | 1.0 | 0.76\n",
    "linear | 0.7 | 0.81 | 0.74 | 0.98 | 0.84\n",
    "linear | 1 | 0.55 | 0.53 | 1.0 | 0.7\n",
    "sigmoid | 0.1 | 0.52 | 0.52 | 1.0 | 0.68\n",
    "sigmoid | 1 | 0.52 | 0.52 | 1.0 | 0.68"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5.参数可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n",
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\svm\\_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  warnings.warn(\"Liblinear failed to converge, increase \"\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'accuracy_score')"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "# YOUR CODE HERE\n",
    "y = []\n",
    "\n",
    "for i in range(10):\n",
    "    m = 0.1 * (i + 1)\n",
    "    clf=LinearSVC(C = m)\n",
    "    clf.fit(trainX,trainY)\n",
    "    prediction=clf.predict(testX)\n",
    "    y.append(prediction)\n",
    "    \n",
    "x = np.linspace(0.1,1,10)\n",
    "test = [accuracy_score(testY, val) for val in y]\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(x,test,'-')\n",
    "plt.title(\"SVM's accuracy_score changes with the C\")\n",
    "plt.xlabel(\"C\")    \n",
    "plt.ylabel(\"accuracy_score\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "模型 | 超参 | 精度 | 查准率 | 查全率 | F1\n",
    "- | - | - | - | - | -\n",
    "logistics | max_iter = 100 | 0.83 | 0.81 | 0.89 | 0.85\n",
    "决策树 | 最大深度 = 3 | 0.81 | 0.81 | 0.85 | 0.83\n",
    "神经网络 | 层数 = 3 | 0.52 | 0.52 | 1.0 | 0.68\n",
    "SVM | 核函数 = linear & C = 0.7 | 0.81 | 0.74 | 0.98 | 0.84"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
